package com.day17;

import org.junit.Test;

/**
 * 关于StringBuffer和StringBuilder的使用
 */
public class StringBufferBuilderTest {
    /**
     * String,StringBuffer,StringBuilder三者的异同?
     * String:不可变的字符序列,底层都是使用char[]
     * StringBuffer:可变的字符序列:线程安全的,效率偏低,底层都是使用char[]
     * StringBuilder:可变的字符序列:线程不安全，效率高,底层都是使用char[]
     * <p>
     * 源码分析:
     * String str = new String();//new char[]
     * <p>
     * String str1 = new String("abc"); //new char[]{'a','b','c'}
     * <p>
     * StringBuffer sb1 = new StringBuffer();//相当于创建了一个长度为16的char[]数组
     * sb1.append('a');//value[0] = 'a';
     * <p>
     * StringBuffer sb2 = new StringBuffer("abc");  //char[] value = new char["abc".length() + 16]
     * <p>
     * //问题1:System.out.println(sb2.length())? //3
     * //问题2:扩容问题:如果要添加的数据，超出底层数组的范围，那就需要扩容底层的数组。
     * 默认情况下，扩容为原来容量的2倍 + 2,同时将原来数组中元素复制到新的数组中。
     * <p>
     * 指导意义:开发中建议大家使用StringBuffer(int capacity)或StringBuilder(int capacity)
     * 这样一开始指定长度，可以避免扩容
     *
     * 效率对比
     * StringBuilder > StringBuffer> String
     */

    @Test
    public void test1() {
        StringBuffer stringBuffer = new StringBuffer("abc");
        stringBuffer.setCharAt(0, 'm');
        System.out.println(stringBuffer.length());//3,看底层代码count


    }

    /**
     * 常用方法
     * 总结:
     * 增:append(xxx)
     * 删除:delete
     * 改:setCharAt(), replace
     * 查询:charAt()
     * 插入:insert()
     * 长度:length()
     * 遍历:for + charAt()
     */
    @Test
    public void test2() {
        StringBuffer s1 = new StringBuffer("abc");
        //添加
        s1.append(1);
        s1.append('1');
        System.out.println(s1);

        //范围删除
        s1.delete(2, 4);
        System.out.println(s1);

        //根据索引，插入数据
        s1.insert(2, false);
        System.out.println(s1);
    }
}
